let esprima = require("esprima");
let estraverse = require("estraverse");
let escodegen = require('escodegen');

let sourceCode = 'function ast(){}'
// Module {
//   type: 'Program',
//   body: [
//     FunctionDeclaration {
//       type: 'FunctionDeclaration',
//       id: [Identifier],
//       params: [],
//       body: [BlockStatement],
//       generator: false,
//       expression: false,
//       async: false
//     }
//   ],
//   sourceType: 'module'
// }
//esprima 可以将源代码转成抽象语法树
let ast = esprima.parseModule(sourceCode)
console.log(ast);
//estraverse 用来遍历语法树上的所有节点，然后可以处理你关心的节点
//遍历是一个深度优先的过程
let indent = 0;
const padding = () => " ".repeat(indent);
//这其实用了一个设计模式，访问器模式
//遍历过程是个深度优先的过程
//遍历并且转换语法树
estraverse.traverse(ast,{
    enter(node){
        console.log(padding()+node.type+"进入");
        indent+=2;
    },
    leave(node){
        indent-=2;
        console.log(padding() + node.type + "离开");
    }
})